package redis

import (
	"context"
	"github.com/go-redis/redis/v8"
	"mychat/internal/common/logger"
	"mychat/internal/conf"
)

type Redis interface {
	HSet(ctx context.Context, key string, vals map[uint]interface{}) error
	HGet(ctx context.Context, key string, field string) (string, error)
	HDel(ctx context.Context, key string, field string) error
	HGetAll(ctx context.Context, key string) (map[string]string, error)
}

type redisdb struct {
	client *redis.Client
	rc     *conf.Redis
	lg     logger.Logger
}

func NewRedis(rc *conf.Redis, lg logger.Logger) Redis {
	return &redisdb{
		client: createRedisClient(rc),
		rc:     rc,
		lg:     lg.WithCustomTag(logger.LoggerTagRedis),
	}
}

func createRedisClient(cr *conf.Redis) *redis.Client {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // Redis地址
		Password: "",               // 密码（如果未设置密码则为空字符串）
		DB:       0,                // 使用默认DB
	})

	_, err := rdb.Ping(context.Background()).Result()
	if err != nil {
		panic(err)
	}
	return rdb
}

func (s *redisdb) HSet(ctx context.Context, key string, vals map[uint]interface{}) error {
	_, err := s.client.HSet(ctx, key, vals).Result()
	if err != nil {
		return err
	}
	return nil
}

func (s *redisdb) HGet(ctx context.Context, key string, field string) (string, error) {
	t, err := s.client.HGet(ctx, key, field).Result()
	if err == nil {
		return t, err
	}
	if err == redis.Nil {
		return "", nil
	}
	return "", err
}

func (s *redisdb) HDel(ctx context.Context, key string, field string) error {
	_, err := s.client.HDel(ctx, key, field).Result()
	if err == nil {
		return nil
	}
	return err
}

func (s *redisdb) HGetAll(ctx context.Context, key string) (map[string]string, error) {
	vmap, err := s.client.HGetAll(ctx, key).Result()
	if err == nil {
		return vmap, err
	}
	if err == redis.Nil {
		return nil, nil
	}
	return nil, err
}
